Tahap Pengetahuan: Pertengahan. Post ini sesuai untuk anda yang sudah biasa dengan pengaturcaraan Arduino dan Blynk.
Notifikasi amaran kepada telefon pintar, merupakan salah satu kaedah penerimaan maklumat paling pantas yang disampaikan oleh peranti (Arduino/Raspberry Pi atau mana-mana mikropengawal termasuk sensor dan aktuator) yang berhubung dengan Internet, dimana pengguna telefon pintar yang menerima notifikasi boleh membuat keputusan dengan lebih cepat dan tepat.
Kaedah ini sangat membantu dalam memberikan amaran awal, sebelum berlakunya kejadian yang tidak kita ingini, seperti kebakaran, kemalangan, bencana alam dan sebagainya.
Walaubagaimanapun, ada peranti yang menghantar notifikasi terlalu kerap kepada telefon pintar hingga menyebabkan pengguna telefon pintar menjadi bosan dengan penerimaan notifikasi yang terlalu banyak dalam pada julat masa yang terlalu singkat.
Antara persoalan yang timbul, adakah cara yang baik supaya telefon pintar kita menerima notifikasi dengan cara yang lebih professional, contohnya telefon pintar akan terima notifikasi setiap 3 minit selagi wujud data yang tidak normal.
Oleh itu, pada post ini saya akan kongsikan bagaimana caranya kita boleh menentukan selang masa antara notifikasi pertama, notifikasi kedua dan notifikasi seterusnya, dengan pengaturcaraan Arduino.
Dalam post ini, kita akan mengambil contoh pemantau nilai suhu, dimana kita akan menerima notifikasi Blynk pada telefon pintar, apabila nilai suhu melebihi nilai 45°C.
Dalam post ini, saya menganggap bahawa anda sudah membuat pengaturcaraan notifikasi dengan aplikasi Blynk sebelum mengikuti post ini, cuma anda mempunyai cabaran dalam penerimaan notifikasi Blynk yang terlalu kerap, contoh pengaturcaraan yang anda sudah buat seperti dibawah:
if(suhu > 45){ Blynk.notify("Amaran Suhu"); Blynk.email("ariffinastute@live.com", "Blynk Alert!", "Amaran Suhu"); }
Apa yang tidak patut dengan pengaturcaraan Arduino diatas adalah, mikropengawal akan kerap menghantar notifikasi apabila nilai suhu melebihi 45, dimana perkara ini akan berlaku bagi setiap pusingan dalam function void loop()
Jom saya kongsikan, bagaimana caranya untuk kita perbaiki pengaturcaraan diatas?
Oleh itu, bagi menyediakan kaedah pengaturcaraan selang masa bagi setiap notifikasi, pertama sekali, kita perlu menyatakan pembolehubah yang boleh menyimpan status bagi notifikasi sudah dihantar atau belum dihantar dan menggunakan function millis, seperti:
pernyataan pembolehubah (contoh: deliver)
- pembolehubah deliver sama dengan 0, membawa maksud notifikasi belum dihantar.
- pembolehubah deliver sama dengan 1, membawa maksud notifikasi sudah dihantar.
boolean deliver = 0;
dengan cara ini, mikropengawal mempunyai memori sama ada notifikasi sudah dihantar ataupun belum.
Dengan memori pembolehubah deliver ini kita boleh buat if else conditional statement dimana, jika nilai suhu lebih daripada yang ditetapkan dan notifikasi masih belum dihantar, maka mikropengawal akan mula menghantar notifikasi dan menjadikan pembolehubah deliver sebagai 1, menandakan notifikasi telah dihantar, seperti arahan if dibawah ini.
if(suhu > 45 && deliver == 0){ Blynk.notify(notice); Blynk.email("ariffinastute@live.com", "Blynk Alert!", notice); deliverTime = millis(); deliver = 1; }
seterusnya mikropengawal akan mula membuat kiraan berapa lama notifikasi pertama telah dihantar dan apabila nilai suhu masih lebih daripada yang ditetapkan, nilai deliver 1 dan sudah melebihi dari 3 minit maka, mikropengawal akan membuat penghantaran notifikasi kedua, seperti arahan dibawah ini:
if(humidity > 80 && deliver == 1 && millis() - deliverTime > 15000){ Blynk.notify(notice); Blynk.email("ariffinastute@live.com", "Blynk Alert!", notice); deliver = 1; }
begitulah mikropengawal akan berterusan melihat keadaan notifikasi sudah dihantar dengan julat masa yang ditetapkan sesuai dengan masa yang ditetapkan oleh kita.
Ini adalah pegaturcaraan Arduino yang lengkap untuk rujukan anda, dengan contoh notifikasi emel dengan nilai kelembapan lebih daripada 80%.
#define BLYNK_PRINT Serial // ESP8266 //#include <ESP8266WiFi.h> //#include <BlynkSimpleEsp8266.h> // ESP32 #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> char auth[] = "AUTHTOKENANDA"; char ssid[] = "WIFISSIDANDA"; char pass[] = "WIFIPASSWORDANDA"; #include <SimpleDHT.h> SimpleDHT11 dht11(5); boolean deliver = 0; // unsigned long deliverTime = 0; void setup(){ Serial.begin(9600); Blynk.begin(auth, ssid, pass); delay(3000); } void loop(){ Blynk.run(); byte temperature = 0; byte humidity = 0; int err = SimpleDHTErrSuccess; if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { return; } Serial.println("Temperature:" + String(temperature)); Serial.println("Humidity:" + String(humidity)); Serial.println(); Blynk.virtualWrite(V0, temperature); Blynk.virtualWrite(V1, humidity); String notice = "Hi, humidity now " + String(humidity) + "%, above 80%!"; if(humidity > 80 && deliver == 0){ Blynk.notify(notice); Blynk.email("ariffinastute@live.com", "Blynk Alert!", notice); deliverTime = millis(); deliver = 1; } if(humidity > 80 && deliver == 1 && millis() - deliverTime > 15000){ Blynk.notify(notice); Blynk.email("ariffinastute@live.com", "Blynk Alert!", notice); deliver = 1; } }
Semoga perkongsian ini bermanfaat, sehingga jumpa lagi.